﻿/*
# -*- coding: utf-8 -*-
# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

 */
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public partial class ResourceManager : Singleton<ResourceManager>
{

//#if IN_APP
    //public static event Action<string> ProductPurchased;
    //public static event Action<bool> ProductRestored;
//#endif

    public static string NoAdsProductID => GameSettings.Default.InAppSetting.removeAdsId;
    public static bool AbleToRestore => !UnlimitedHints;
    public static bool EnableAds
    {
        get => PrefManager.GetBool(nameof(EnableAds), true);
        set => PrefManager.SetBool(nameof(EnableAds), value);
    }

    public static int Hints
    {
        get => PrefManager.GetInt(nameof(Hints), 3);
        set => PrefManager.SetInt(nameof(Hints), value);
    }

//    public static int Stars
//    {
//        get => PrefManager.GetInt(nameof(Stars), 0);
//        set => PrefManager.SetInt(nameof(Stars),value);
//    }

    public static bool UnlimitedHints
    {
        get => PrefManager.GetBool(nameof(UnlimitedHints), false);
        set => PrefManager.SetBool(nameof(UnlimitedHints), value);
    }

    public static int Coins
    {
        get => PrefManager.GetInt(nameof(Coins));
        set => PrefManager.SetInt(nameof(Coins), value);
    }

    public static Store Store => Store.Default;



    //    public static bool AbleToRestore => EnableAds;

    //public Purchaser Purchaser { get; private set; }

    protected override void OnInit()
    {
        base.OnInit();
        //Purchaser = new Purchaser(
        //    Store.Hints.Where(product => product.priceDetails.type == PriceDetails.Type.InAppConsumable).Select(product => product.priceDetails.productId),
        //    Store.Hints.Where(product => product.priceDetails.type == PriceDetails.Type.InAppNonConsumable).Select(product => product.priceDetails.productId).Concat(new[] { NoAdsProductID }));
        //Purchaser.RestorePurchased += PurchaserOnRestorePurchased;
    }

    private void PurchaserOnRestorePurchased(bool restored)
    {
        var unlimitedProductId = Store.Hints.FirstOrDefault(product => product.isUnlimited).priceDetails
            .productId;
        if (!UnlimitedHints )//&&Purchaser.ItemAlreadyPurchased(unlimitedProductId)
            
        {
            UnlimitedHints = true;
        }

        if (EnableAds)// && Purchaser.ItemAlreadyPurchased(NoAdsProductID)
        {
            EnableAds = false;
        }
        //Debug.Log($"InAppPurchase Restored Unlimited:{Purchaser.ItemAlreadyPurchased(unlimitedProductId)}");
        //ProductRestored?.Invoke(restored);
    }


    public static void RestorePurchase()
    {
        Debug.Log("Restore InAppPurchase");
        //Instance.Purchaser.Restore();
    }

    private static void PurchaseInApp(string productId, Action<bool> completed = null)
    {
        //Instance.Purchaser.BuyProduct(productId, success =>
        //{
        //    completed?.Invoke(success);
        //    if (success)
        //        ProductPurchased?.Invoke(productId);
        //});
    }

    //public static string GetPrice(string productId) => Instance?.Purchaser?.GetPrice(productId);

    public static HintProduct GetHint(string id) => Store.Hints.FirstOrDefault(product => product.id == id);

    public static void PurchaseHint(string hintProductId, Action<bool> completed = null)
    {
        var product = GetHint(hintProductId);
        if (product.priceDetails.type == PriceDetails.Type.InAppConsumable || product.priceDetails.type == PriceDetails.Type.InAppNonConsumable)
        {
            PurchaseInApp(product.priceDetails.productId, success =>
            {
                if (success)
                {
                    if (product.isUnlimited)
                        UnlimitedHints = true;
                    else
                        Hints += product.value;
                }
                completed?.Invoke(success);
            });
        }
    }

    public static void PurchaseNoAds(Action<bool> completed)
    {
        PurchaseInApp(NoAdsProductID, (success) =>
        {
            if (success)
                EnableAds = false;

            completed?.Invoke(success);
        });
    }
}


public partial class ResourceManager
{

    public static IEnumerable<LevelGroup> LevelGroups => global::LevelGroups.Default;

    public static LevelGroup GetLevelGroup(string groupID)
    {
        return LevelGroups.First(group => @group.id == groupID);
    }


    public static Level GetLevel(string groupId, int level)
    {
        return GetLevelGroup(groupId).levels.FirstOrDefault(l => l.LevelNo == level);
    }

    public static bool IsLevelLocked(string groupId, int no)
    {
        var completedLevel = GetCompletedLevel(groupId);

        return no > completedLevel + 1;
    }

    public static int GetCompletedLevel(string groupID)
    {
        return PrefManager.GetInt($"{groupID}_Level_Complete");
    }

    public static void CompleteLevel(string groupId, int lvl)
    {
        if (GetCompletedLevel(groupId)>=lvl)
        {
            return;
        }

        PrefManager.SetInt($"{groupId}_Level_Complete",lvl);
    }

    public static bool HasLevel(string groupID, int lvl) => GetLevelGroup(groupID).Count() >= lvl;

  
}